Fahrplan

  1. Kurze Wiederholung: 1PL Gleichungen
  2. Erweiterung: 2PL und 3PL
  3. Modellfit beurteilen
  4. Partial Credit Modelle (PCM)

1PL Modell

\[ logit(P(X_{pi}=1)) = \theta_p - \beta_i \]

Logit

\[ ln\left(\frac{P(X_{pi}=1)}{1-P(X_{pi}=1)}\right) \]

  • Transformation der Ergebnisse unseres linearen Terms, damit die Wahrscheinlichkeitswerte nicht mehr zwischen 0 und 1 liegen und linear modeliert werden können.
  • Wahrscheinlichkeit \(p\) durch Gegenwahrscheinlichkeit \(1-p\).
  • Inverse der logit ist die logistische Funktion.

1PL Modell: Umformen



\[ logit(P(X_{pi}=1)) = \ln\left(\frac{P(X_{pi}=1)}{1-P(X_{pi}=1)}\right) = \theta_p - \beta_i \]

1PL Modell: Umformen

\[ \frac{p_{pi}}{1-p_{pi}} = exp(\theta_p - \beta_i) \]

\[ p_{pi} = exp(\theta_p - \beta_i)*( 1-p_{pi}) \]

1PL Modell: Umformen

\[ p_{pi} + p_{pi} * exp(\theta_p - \beta_i) = exp(\theta_p - \beta_i) \]


\[ p_{pi}*(1+exp(\theta_p - \beta_i)) = exp(\theta_p - \beta_i) \]

1PL Schreibweise 1

\[ P(X_{pi}=1) = \frac{exp(\theta_p - \beta_i)}{1 + exp(\theta_p - \beta_i)} \]

1PL Schreibweise 2

\[ P(X_{pi}=1) = \frac{e^{\theta_p - \beta_i}}{1 + e^{\theta_p - \beta_i}} \]

1PL Schreibweise 3

\[ P(X_{pi}=1) = \frac{1}{1 + e^{\color{#9B1B34}{-}\theta_p \color{#9B1B34}{+} \beta_i}} \]

Beispiel

\[ \frac{exp(1 - 0.8)}{1 + exp(1 - 0.8)} = 0.55 \]

Wahrscheinlichkeit einer richtigen Antwort über 0.5, wenn \(\theta_p > \beta_i\).

Beispiel

\[ \frac{exp(0.8 - 1)}{1 + exp(0.8 - 1)} = 0.45 \]

Wahrscheinlichkeit einer richtigen Antwort unter 0.5, wenn \(\theta_p < \beta_i\).

Höher parametrisierte   IRT Modelle

Neue Paramter

Wir können Parameter zu diesem Modell hinzufügen, wodurch wir flexibler in der Modellierung werden:

  • Schwierigkeit \(\beta_i\) (Intercept)
  • Steigung \(\alpha_i\) (Faktorladung, Diskriminationsparameter)
  • Ratewahrscheinlichkeit \(\gamma_i\)

3PL

\[ P(X_{pi}=1) = \color{#aaa938}{\gamma_i} + (1-\color{#aaa938}{\gamma_i})\frac{exp(\color{#F4BA02}{\alpha_i}(\theta_p - \color{#00e0e0}{\beta_i})))}{1 + exp(\color{#F4BA02}{\alpha_i}(\theta_p - \color{#00e0e0}{\beta_i}))} \]

  • Schwierigkeit
  • Diskriminationsparamter
  • Ratewahrscheinlichkeit
    • z.B. bei 4 Antwortmöglichkeiten: \(\gamma_i = 1/4 = 0.25\)

2PL

\(\gamma_i = 0\)

\[ P(X_{pi}=1) = \color{#9B1B34}{0} + (1-\color{#9B1B34}{0})\frac{exp(\alpha_i(\theta_p - \beta_i)))}{1 + exp(\alpha_i(\theta_p - \beta_i))} \]

1PL

\(\alpha_i = 1\)

\[ P(X_{pi}=1) = 0 + (1-0)\frac{exp(\color{#9B1B34}{1}(\theta_p - \beta_i)))}{1 + exp(\color{#9B1B34}{1}(\theta_p - \beta_i))} \]

Darstellung

Simulieren von IRT Daten

Jetzt ist ein guter Zeitpunkt, und uns ein sehr mächtiges Werkzeug anzuschauen: Datensimulation.
Geht zur Übung und probiert es aus.

Welches Modell?

Tradeoff zwischen Underfit und Overfit

Tradeoff zwischen Underfit und Overfit

Tradeoff zwischen Underfit und Overfit

1PL vs. 3PL

Mehr Parameter müsen nicht immer auch besser sein. Gerade im IRT-Kontext können komplexere Modelle schnell an ihre Grenzen kommen und nicht konvergieren.

1PL

1PL Modelle sind nicht so sehr von den tatsächlichen Daten abhängig (ähnlich wie die lineare Regression im Beispiel) und damit ähnlicher über verschiedene Datenerhebungen (da es weniger Möglichkeiten gibt, sich direkt an die Daten anzupassen). Andererseits kann es natürlich sein, dass sie zu sehr vereinfachen.

1PL vs. 3PL

3PL

Können Personen mit hohen Fähigkeitswerten bestrafen, da die obere Asympotete bei 1 liegt, und somit eine 0% Wahrscheinlichkeit besteht, dass jemand im hohen Fähigkeitsbereich ein Item falsch beantwortet. Andersrum gibt es eine minimale Lösungswahrscheinlichkeit.

Mögliche Punkte

Bei Modellwahl zu beachten:

  • Gewichtung der Items
  • Antwortskala
  • Simulation/Modellfit
  • Ziel

Gesamten Modellfit

Es gibt verschiedene Fit-Statistiken, die uns bei Aussagen über den Modellfit helfen, z.B.:

Deviance

Deviance ist ein Maß für die relative Distanz einer Vorhersage von perfeketer Accuracy.
Wir können uns die Konvergenzplots anschauen:

Code
library(TAM)

data(data.sim.rasch)

mod_2pl <- tam.mml.2pl(resp = data.sim.rasch, verbose = FALSE, irtmodel = "2PL")

plotDevianceTAM(mod_2pl)

Fit Indices (z.B. AIC, BIC)

Da die Deviance (fast) immer besser wird, je mehr Parameter wir ins Modell mit aufnehmen, bestrafen Fit Indices die Anzahl der Parameter.
Keine Daumenregeln für Cutoff Werte, daher für Vergleich von genesteten Modellen.

Code
**** Calculate Residuals 
**** Calculate Counts 
**** Calculate Covariances 
Test of Global Model Fit (Maximum Chi Square)
    maxX2 Npairs p.holm
1 9.79789    780      1

MADaQ3 Statistic and Test of Global Model Fit (Maximum aQ3)
  MADaQ3 maxaQ3      p
1 0.0179 0.0851 0.1082

Summary of Q3 and adjusted Q3 statistics (based on posterior distribution)
  type       M     SD     min    max  SGDDM wSGDDM
1   Q3 -0.0228 0.0227 -0.1011 0.0622 0.0263 0.0263
2  aQ3  0.0000 0.0227 -0.0783 0.0851 0.0179 0.0179

Fit Statistics
100*MADCOV       SRMR      SRMSR 
     0.281      0.014      0.018 

Schätzen die out-of-Sample predictive accuracy. Das muss nicht immer das Ziel sein.

Inferenzstatistisch

Wir könne auch den Likelihood Ratio Test nutzen, um die Modelle zu vergleichen. Er erlaubt zum einen den Vergleich der empirischen und der Modellimplizierten Kovarianzmatrix, aber auch den Vergleich der Kovarianzmatrizen genesteter Modelle.

Hängt von der Stichprobengröße ab und hat auch einige weitere Probleme. Sollte deshalb nicht in Isolation genutzt werden, sondern möglichst mit anderen Fitmaßen, z.B. den besprochenen deskriptiven, zusammen.

Itemfit

Itemfitplots

Erwartete und die beobachtete Itemkurven übereinander:

Code
invisible(
plot(mod_2pl,
  items = 1:3, 
  export = FALSE,
  observed = TRUE,
  package = "graphics")
)

Achtung! Die grafische Überprüfung ist stark von der Anzahl an geplotteten Punkten abhängig, die man wählt.

Infit/Outfit

Residuen-basierte Fit-Statistiken, die die Steigung der ICC characterisieren.

Es sollten also vor allem Items mit einem Fit-Kriterium über 1 genauer betrachtet werden.
Infit/Outfit sind relativ, da sie den Item-Fit relativ zu den anderen Items im Itemset beurteilen.

Cut-off Werte sind abhängig von der Stichprobengröße (siehe hier)

Infit/Outfit

Infit

Sensitiv für Abweichungen bei Items, die von der Schwierigkeit auf die Person zugeschnitten sind (Itemschwierigkeit und Personenfähigkeit passen zu einander).

Outfit

Sensitiv für Outlier (z.B. leistungsstarke Personen beantworten ein sonst leichtes Item falsch)

Code
tam.fit(mod_2pl)
Item fit calculation based on 15 simulations
|**********|
|----------|
$itemfit
   parameter    Outfit    Outfit_t  Outfit_p Outfit_pholm     Infit
1         I1 0.9702388 -0.78578606 0.4319928            1 0.9995408
2         I2 0.9776494 -0.62127284 0.5344201            1 1.0001405
3         I3 1.0029498  0.08950661 0.9286793            1 1.0003813
4         I4 0.9601867 -1.26234667 0.2068241            1 1.0058597
5         I5 1.0057753  0.19346052 0.8465983            1 1.0050784
6         I6 0.9778385 -0.72392403 0.4691124            1 1.0020055
7         I7 1.0266178  0.88877924 0.3741217            1 1.0004272
8         I8 1.0248151  0.86073705 0.3893829            1 0.9991164
9         I9 1.0160446  0.59093623 0.5545631            1 0.9972452
10       I10 0.9871044 -0.49979805 0.6172173            1 0.9975807
11       I11 0.9767071 -0.91811268 0.3585599            1 1.0013916
12       I12 1.0002752  0.01492808 0.9880896            1 0.9971319
13       I13 0.9793257 -0.92050754 0.3573076            1 1.0025505
14       I14 1.0095710  0.40270953 0.6871619            1 0.9994234
15       I15 1.0074591  0.36263657 0.7168764            1 0.9952289
16       I16 1.0028097  0.13180217 0.8951408            1 0.9968074
17       I17 1.0258498  1.31037472 0.1900691            1 0.9976696
18       I18 0.9934477 -0.32393014 0.7459909            1 1.0019399
19       I19 0.9976350 -0.11435392 0.9089572            1 0.9990454
20       I20 1.0090004  0.43551104 0.6631915            1 1.0002569
21       I21 1.0038813  0.20169022 0.8401589            1 0.9961451
22       I22 0.9859262 -0.70872380 0.4784959            1 1.0004566
23       I23 0.9925176 -0.36503686 0.7150839            1 0.9976286
24       I24 1.0094553  0.43228419 0.6655349            1 0.9986600
25       I25 0.9957508 -0.19417385 0.8460398            1 1.0048993
26       I26 1.0053207  0.23164253 0.8168157            1 0.9968975
27       I27 1.0137200  0.62773732 0.5301760            1 0.9997622
28       I28 0.9902559 -0.41778847 0.6761018            1 1.0052597
29       I29 0.9650875 -1.39206650 0.1639023            1 1.0065411
30       I30 1.0293681  1.22096865 0.2220979            1 1.0006073
31       I31 1.0083456  0.32568305 0.7446642            1 1.0016397
32       I32 0.9941871 -0.22563868 0.8214825            1 0.9991239
33       I33 0.9791459 -0.72965959 0.4655983            1 1.0075054
34       I34 0.9992081 -0.02554779 0.9796180            1 0.9997834
35       I35 0.9912865 -0.27748172 0.7814102            1 1.0030768
36       I36 0.9872949 -0.39385885 0.6936852            1 1.0037123
37       I37 0.9656552 -1.03033118 0.3028546            1 1.0004502
38       I38 1.0478258  1.35170880 0.1764685            1 0.9961915
39       I39 0.9777037 -0.59124893 0.5543536            1 1.0063977
40       I40 1.0452424  1.13680502 0.2556198            1 0.9900155
         Infit_t   Infit_p Infit_pholm
1  -0.0011919297 0.9990490           1
2   0.0149101979 0.9881038           1
3   0.0211813812 0.9831010           1
4   0.1938903732 0.8462617           1
5   0.1729951105 0.8626553           1
6   0.0743668230 0.9407185           1
7   0.0226841788 0.9819022           1
8  -0.0226379728 0.9819391           1
9  -0.0940184019 0.9250945           1
10 -0.0862931045 0.9312334           1
11  0.0606706637 0.9516215           1
12 -0.1134573943 0.9096679           1
13  0.1161509459 0.9075329           1
14 -0.0187073816 0.9850745           1
15 -0.2259730878 0.8212224           1
16 -0.1425160689 0.8866724           1
17 -0.1144376180 0.9088909           1
18  0.1005737884 0.9198888           1
19 -0.0402497812 0.9678940           1
20  0.0184050163 0.9853158           1
21 -0.1958259999 0.8447464           1
22  0.0273197655 0.9782047           1
23 -0.1120027186 0.9108213           1
24 -0.0553337443 0.9558726           1
25  0.2254391845 0.8216376           1
26 -0.1331057312 0.8941098           1
27 -0.0052730655 0.9957927           1
28  0.2303512199 0.8178189           1
29  0.2612529229 0.7938975           1
30  0.0319019511 0.9745502           1
31  0.0707536836 0.9435938           1
32 -0.0284450455 0.9773072           1
33  0.2681149435 0.7886108           1
34  0.0003152105 0.9997485           1
35  0.1065374215 0.9151560           1
36  0.1236280084 0.9016098           1
37  0.0239843349 0.9808651           1
38 -0.1006512732 0.9198273           1
39  0.1797938683 0.8573144           1
40 -0.2413286672 0.8093004           1

$time
[1] "2024-10-22 06:07:56 UTC" "2024-10-22 06:07:56 UTC"

$CALL
tam.fit(tamobj = mod_2pl)

attr(,"class")
[1] "tam.fit"

Infit/Outfit

Code
# Definieren einer eigenen Plot-Funkktion
plot_infit_outfit <- function(tam_obj){
fit_tam <- tam.fit(tam_obj)$itemfit

fit_plotdat <- fit_tam %>%
  # Als Faktor umwandeln, damit die Sortierung im Plot stimmt
  mutate(Item = factor(parameter, levels = unique(parameter[order(as.numeric(parameter))]))) %>%
  select(Item, Outfit, Infit) %>%
  pivot_longer(cols = c(Outfit, Infit), names_to = "fit", values_to = "value")

ggplot(fit_plotdat, aes(x = value, y = Item)) +
  geom_point(colour = "#F4BA02") +
  facet_grid(. ~ fit, scales = "fixed") +
  xlim(0.4, 1.6) +
  theme_bg() +
  geom_vline(xintercept = 0.5, linetype = "dotted", colour = "#9B1B34") +
  geom_vline(xintercept = 1.5, linetype = "dotted", colour = "#9B1B34")
}

plot_infit_outfit(mod_2pl)
Item fit calculation based on 15 simulations
|**********|
|----------|

Personfit

Wie gut stimmen die Antwortmuster der Personen mit dem Modell überein?

Infit Outfit

Code
p_fit <- tam.personfit(mod_2pl) %>%
  pivot_longer(cols = c(outfitPerson, infitPerson), names_to = "fit", values_to = "value")

ggplot(p_fit, aes(x = value)) +
  geom_histogram(colour= "#F4BA02", fill = "#01364C", binwidth = 0.1) +
  theme_bg() +
  xlim(0, 2) +
  facet_grid(. ~ fit)

Mögliche weitere Fragestellungen

Wir können uns noch viele weitere Dinge mit unseren Modellen anschauen. Sehr hilfreich dabei kann das Paket ggmirt sein, dass eine Vielzahl von praktischen Plots für die Auswertung bereitstellt.

Item Person Map

Ist die Fähigkeitsrange durch die Items gut Abgedeckt?

itempersonMap(mod_mirt) + theme_bg() 

ICC

tracePlot(mod_mirt) + theme_bg()

ICC

tracePlot(mod_mirt, facet = F, legend = T) + theme_bg()

Item Information Curves

Wie viel Information steuert jedes Item zur Schätzung von Theta bei?

itemInfoPlot(mod_mirt) + theme_bg()

Item Information Curves

itemInfoPlot(mod_mirt, facet = T) + theme_bg()

Test Information Curve

testInfoPlot(mod_mirt, adj_factor = 2) + theme_bg()

Summary

summaryPlot(mod_mirt, adj_factor = 2) +
  theme_bg() 

Was tun bei polytomen Items?

Beispielaufgabe

Ich bin bequem, neige zur Faulheit.

(trift überhaupt nicht zu) 1 … 2 … 3 … 4 … 5 (trift voll und ganz zu)

Wie?

Partial Credit

Grundidee

Erweiterung des 1PL Modells: Den einzelnen Antwortkategorien wird eine eigene Schwierigkeit (Schwellenparameter) zugeordnet. Dadurch können wir die Antwortwahrscheinlichkeit in einer bestimmten Kategorie berechnen.

Anwendungsbereich

Ordinale Daten (geordnete Antwortkategorien), z.B.:

  • Likert-Skalen
  • Items, die auch mit Teilpunkten bewertet werden können (z.B. in Mathe)

Darstellung

Für ein Item:

Raw score curve

Für einen “Test” aus 2 Items:

Alternativen

  • Partial Credit Modelle nehmen die gleiche Steigung für alle Items an.
  • Generalisierte PCMs treffen diese Annahme nicht.
  • Ratingscale Modell: Relative Schwierigkeit der Schwellenparameter unterscheidet sich zwischen den Items nicht (Schritte sind also ähnlich schwer bei jedem Item, z.B. Likert-Skala).

Übung

Gehe zur Partial-Credit-Übung und bearbeite sie.

Bildquellen